
#!/usr/bin/envs/tf_gpu/bin  python3
# Auther         jinas
# Datetime       2020-03-18 12:02:00
# Description    CSDN学院 人工智能课程 DL部分 第一课


import numpy as np

#逻辑与数据


samples_and = [
    [0, 0, 0],
    [1, 0, 0],
    [0, 1, 0],
    [1, 1, 1],
]

samples_or = [
    [0, 0, 0],
    [1, 0, 1],
    [0, 1, 1],
    [1, 1, 1],
]

samples_xor = [
    [0, 0, 0],
    [1, 0, 1],
    [0, 1, 1],
    [1, 1, 0],
]

def perception(samples):
    w = np.array([1,2])
    b = 0
    a = 1
    for i in range(10):#epoch
        for j in range(4):#样本
            x = np.array(samples[j][:2])
            y = 1 if np.dot(w,x) + b > 0 else 0
            d = np.array(samples[j][2])
            delta_b = a*(d-y)
            delta_w = a* (d-y)*x

            print(f"epoch {i} sample {j} [{w[0]},{w[1]},{b},{y},{delta_w[0]},{delta_w[1]},{delta_b}] ")
            print('epoch {} sample {} [{} {} {} {} {} {} {}]'.format(
                i,j,w[0],w[1],b,y,delta_w[0],delta_w[1],delta_b
            ))
            w = w + delta_w
            b = b + delta_b
if __name__  == "__main__":
    print("logical and")
    perception(samples_and)
    print("logical or")
    perception(samples_or)
    print("logical xor")
    perception(samples_xor)

'''
    关于感知器无法解决异或问题，在没有隐层时候，超平面至多只能分为两个部分，感知器是无隐层结构的模型，至多产生单一线性区分功能
    而异或问题至少需要两个线性区分，这是单一感知器无法解决的
'''